package java.util.concurrent.locks;

import java.util.concurrent.TimeUnit;
import java.util.Date;


/**
 * Condition为接口类型，它将 Object 监视器方法(wait、notify 和 notifyAll)分解成截然不同的对象，
 * 以便通过将这些对象与任意 Lock 实现组合使用，为每个对象提供多个等待 set (wait-set)。
 * 其中，Lock 替代了 synchronized 方法和语句的使用，Condition 替代了 Object 监视器方法的使用。可以通过await(),signal()来休眠/唤醒线程。
 */
public interface Condition {

    /**
     * 暂停此线程直至一下四种情况发生
     * 1.此Condition被signal()
     * 2.此Condition被signalAll()
     * 3.Thread.interrupt()
     * 4.虚假唤醒
     * 以上情况.在能恢复方法执行时,当前线程必须要能获得锁
     */
    void await() throws InterruptedException;

    // 跟上面类似,不过不响应中断
    void awaitUninterruptibly();

    // 带超时时间的await()，并响应中断
    long awaitNanos(long nanosTimeout) throws InterruptedException;

    // 带超时时间的await()
    boolean await(long time, TimeUnit unit) throws InterruptedException;

    // 带deadline的await()
    boolean awaitUntil(Date deadline) throws InterruptedException;

    // 唤醒某个等待在此condition的线程
    void signal();

    // 唤醒有等待此condition的所有线程
    void signalAll();
}
